Factories
The WOLF framework uses a factory-based system to dynamically create and configure components. This design allows users to define their system’s configuration in YAML files, enabling flexibility and modularity.
The creation of some of the WOLF nodes (landmark, map, processor, sensor, solver` and tree_manager) and WOLF ROS publishers and subscribers, can be performed using factories.
This allows modularity, i.e. the creation of nodes without need of adding to the code the corresponding include file. For example, to create a SensorLaser2d using the FactorySensorFile, you can use the following code without need of including sensor_laser_2d.h:
auto sensor_laser = FactorySensorFile::create("SensorLaser2d",
"/path/to/sensor/config_file.yaml",
{"path/containing/schemas",
"path/containing/more/schemas"});
Two items are required to allow a factory-based creation of an object:
Object Creators: The factory requires a static method with a common API that creates a derived class object returning a pointer of the base type. We call this methods “creators”.
Creators registration: The creators should be registered in a factory with a unique type string (e.g.,
"SensorLaser2d"). This registration ensures that the factory knows how to instantiate theSensorLaser2d::create(...)when requested. This happens at loading time.
In WOLF there are two types of factories, requiring the corresponding creators.
FactoryXXXXFile: Take a YAML file as input and a vector of folders where to locate the schema files for validation.
FactoryXXXXNode: Take a
YAML::Node(yaml-cpp) as input and a vector of folders where to locate the schema files for validation.
Where XXX can be substituted by the different nodes in wolf using factories:
- Sensors
- Processors
- Solver
- TreeManager
- Landmarks (only has the factory taking YAML::Node)
- Publishers (only has the factory taking YAML::Node)
- Subscribers (only has the factory taking YAML::Node)
WOLF macros
For developer convenience, we provide two macros:
WOLF_REGISTER_SENSOR(SensorType): Registers the sensor creators in the corresponding factories.WOLF_SENSOR_CREATE(SensorClass): Automatically implements thecreatemethods for the sensor. Validates YAML parameters using the yaml_schema_cpp library and ensures the sensor is properly initialized. Finally, it links the node with the rest of the WOLF tree.
The analogous macros are provided for all the WOLF nodes using factories.
Note
When a plugin is loaded, you should see a message in the console that confirms that a creator has been registered to a factory. The following is an example of all creators registered when loading plugin core:
FactoryLandmark <-- registered Landmark2d
FactoryLandmark <-- registered Landmark3d
FactoryMapNode <-- registered MapBase
FactoryMapFile <-- registered MapBase
FactoryProcessor <-- registered ProcessorDiffDrive
FactoryProcessorYaml <-- registered ProcessorDiffDrive
FactoryProcessor <-- registered ProcessorFixedWingModel
FactoryProcessorYaml <-- registered ProcessorFixedWingModel
FactoryProcessor <-- registered ProcessorLandmarkExternal
FactoryProcessorYaml <-- registered ProcessorLandmarkExternal
FactoryProcessor <-- registered ProcessorOdom2d
FactoryProcessorYaml <-- registered ProcessorOdom2d
FactoryProcessor <-- registered ProcessorOdom3d
FactoryProcessorYaml <-- registered ProcessorOdom3d
FactoryProcessor <-- registered ProcessorPose2d
FactoryProcessorYaml <-- registered ProcessorPose2d
FactoryProcessor <-- registered ProcessorPose3d
FactoryProcessorYaml <-- registered ProcessorPose3d
FactorySensorNode <-- registered SensorDiffDrive
FactorySensorFile <-- registered SensorDiffDrive
FactorySensorNode <-- registered SensorMotionModel
FactorySensorFile <-- registered SensorMotionModel
FactorySensorNode <-- registered SensorOdom2d
FactorySensorFile <-- registered SensorOdom2d
FactorySensorNode <-- registered SensorOdom3d
FactorySensorFile <-- registered SensorOdom3d
FactorySensorNode <-- registered SensorPose2d
FactorySensorFile <-- registered SensorPose2d
FactorySensorNode <-- registered SensorPose3d
FactorySensorFile <-- registered SensorPose3d
FactoryStateBlock <-- registered StateQuaternion
FactoryStateBlockIdentity <-- registered StateQuaternion
FactoryStateBlockIdentityVector <-- registered StateQuaternion
FactoryStateBlock <-- registered StateAngle
FactoryStateBlockIdentity <-- registered StateAngle
FactoryStateBlockIdentityVector <-- registered StateAngle
FactoryStateBlock <-- registered StateHomogeneous3d
FactoryStateBlockIdentity <-- registered StateHomogeneous3d
FactoryStateBlockIdentityVector <-- registered StateHomogeneous3d
FactoryStateBlock <-- registered StatePoint2d
FactoryStateBlockIdentity <-- registered StatePoint2d
FactoryStateBlockIdentityVector <-- registered StatePoint2d
FactoryStateBlock <-- registered StateVector2d
FactoryStateBlockIdentity <-- registered StateVector2d
FactoryStateBlockIdentityVector <-- registered StateVector2d
FactoryStateBlock <-- registered StatePoint3d
FactoryStateBlockIdentity <-- registered StatePoint3d
FactoryStateBlockIdentityVector <-- registered StatePoint3d
FactoryStateBlock <-- registered StateVector3d
FactoryStateBlockIdentity <-- registered StateVector3d
FactoryStateBlockIdentityVector <-- registered StateVector3d
FactoryStateBlock <-- registered StateParams1
FactoryStateBlockIdentity <-- registered StateParams1
FactoryStateBlockIdentityVector <-- registered StateParams1
FactoryStateBlock <-- registered StateParams2
FactoryStateBlockIdentity <-- registered StateParams2
FactoryStateBlockIdentityVector <-- registered StateParams2
FactoryStateBlock <-- registered StateParams3
FactoryStateBlockIdentity <-- registered StateParams3
FactoryStateBlockIdentityVector <-- registered StateParams3
FactoryStateBlock <-- registered StateParams4
FactoryStateBlockIdentity <-- registered StateParams4
FactoryStateBlockIdentityVector <-- registered StateParams4
FactoryStateBlock <-- registered StateParams5
FactoryStateBlockIdentity <-- registered StateParams5
FactoryStateBlockIdentityVector <-- registered StateParams5
FactoryStateBlock <-- registered StateParams6
FactoryStateBlockIdentity <-- registered StateParams6
FactoryStateBlockIdentityVector <-- registered StateParams6
FactoryStateBlock <-- registered StateParams7
FactoryStateBlockIdentity <-- registered StateParams7
FactoryStateBlockIdentityVector <-- registered StateParams7
FactoryStateBlock <-- registered StateParams8
FactoryStateBlockIdentity <-- registered StateParams8
FactoryStateBlockIdentityVector <-- registered StateParams8
FactoryStateBlock <-- registered StateParams9
FactoryStateBlockIdentity <-- registered StateParams9
FactoryStateBlockIdentityVector <-- registered StateParams9
FactoryStateBlock <-- registered StateParams10
FactoryStateBlockIdentity <-- registered StateParams10
FactoryStateBlockIdentityVector <-- registered StateParams10
FactoryStateBlock <-- registered StateParams11
FactoryStateBlockIdentity <-- registered StateParams11
FactoryStateBlockIdentityVector <-- registered StateParams11
FactoryStateBlock <-- registered StateParams12
FactoryStateBlockIdentity <-- registered StateParams12
FactoryStateBlockIdentityVector <-- registered StateParams12
FactoryStateBlock <-- registered StateParams13
FactoryStateBlockIdentity <-- registered StateParams13
FactoryStateBlockIdentityVector <-- registered StateParams13
FactoryStateBlock <-- registered StateParams14
FactoryStateBlockIdentity <-- registered StateParams14
FactoryStateBlockIdentityVector <-- registered StateParams14
FactoryStateBlock <-- registered StateParams15
FactoryStateBlockIdentity <-- registered StateParams15
FactoryStateBlockIdentityVector <-- registered StateParams15
FactoryStateBlock <-- registered StateParams16
FactoryStateBlockIdentity <-- registered StateParams16
FactoryStateBlockIdentityVector <-- registered StateParams16
FactoryStateBlock <-- registered StateParams17
FactoryStateBlockIdentity <-- registered StateParams17
FactoryStateBlockIdentityVector <-- registered StateParams17
FactoryStateBlock <-- registered StateParams18
FactoryStateBlockIdentity <-- registered StateParams18
FactoryStateBlockIdentityVector <-- registered StateParams18
FactoryStateBlock <-- registered StateParams19
FactoryStateBlockIdentity <-- registered StateParams19
FactoryStateBlockIdentityVector <-- registered StateParams19
FactoryStateBlock <-- registered StateParams20
FactoryStateBlockIdentity <-- registered StateParams20
FactoryStateBlockIdentityVector <-- registered StateParams20
FactoryTreeManagerNode <-- registered TreeManagerSlidingWindow
FactoryTreeManagerFile <-- registered TreeManagerSlidingWindow
FactoryTreeManagerNode <-- registered TreeManagerSlidingWindowDualRate
FactoryTreeManagerFile <-- registered TreeManagerSlidingWindowDualRate
FactorySolverNode <-- registered SolverCeres
FactorySolverFile <-- registered SolverCeres